home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / include / misc.h < prev    next >
C/C++ Source or Header  |  1992-10-20  |  4KB  |  148 lines

  1. #ifndef MISC_H
  2. #define MISC_H
  3.  
  4. #ifndef __GNUC__
  5. #  define __asm__ asm
  6. #endif
  7.  
  8. #define Nullp(x)    (TYPE(x) == T_Null)
  9. #define Truep(x)    (!EQ(x,False) && !Nullp(x))
  10. #define Car(x)      PAIR(x)->car
  11. #define Cdr(x)      PAIR(x)->cdr
  12. #define Val(x)      Cdr(x) /* Obsolete! */
  13. #define Cons        P_Cons
  14. #define Begin       P_Begin
  15. #define Assq(x,y)   General_Assoc(x,y,0)
  16. #define Print(x)    General_Print_Object (x, Curr_Output_Port, 0)
  17. #define Numeric(t)  (t == T_Fixnum || t == T_Flonum || t == T_Bignum)
  18.  
  19. #define Whitespace(c) (c == ' ' || c == '\t' || c == '\014' || c == '\n')
  20. #define Delimiter(c) (c == ';' || c == ')' || c == '(' || c == '#' || c == '"')
  21.  
  22. #ifdef BSD_SIGNALS
  23. #  ifndef sigmask
  24. #    define sigmask(n)  (1 << ((n)-1))
  25. #  endif
  26. #  define Disable_Interrupts (void)sigblock (sigmask (SIGINT))
  27. #  define Enable_Interrupts  (void)sigsetmask (0)
  28. #else
  29. #ifdef POSIX_SIGNALS
  30. #  define Disable_Interrupts (void)sigprocmask (SIG_BLOCK, &Sigset_Block,\
  31.     &Sigset_Old);
  32. #  define Enable_Interrupts  (void)sigprocmask (SIG_SETMASK, &Sigset_Old,\
  33.     (sigset_t *)0);
  34. #else
  35. #  define Disable_Interrupts (void)signal (SIGINT, SIG_IGN)
  36. #  define Enable_Interrupts  {\
  37.        if (!Intr_Was_Ignored) (void)signal (SIGINT, Intr_Handler);\
  38.    }
  39. #endif
  40. #endif
  41.  
  42. /* Align heap addresses */
  43. #ifdef ALIGN_8BYTE
  44. #  define ALIGN(ptr) ((ptr) = (char *)(((int)(ptr) + 7) & ~7))
  45. #else
  46. #  define ALIGN(ptr) ((ptr) = (char *)(((int)(ptr) + 3) & ~3))
  47. #endif
  48.  
  49. /* Normalize stack addresses */
  50. #define NORM(addr)  ((int)(addr) + delta)
  51.  
  52. /* Used in special forms: */
  53. #define TC_Prolog   register _t = Tail_Call
  54. #define TC_Disable  Tail_Call = 0
  55. #define TC_Enable   Tail_Call = _t
  56.  
  57. #define TAG_FUN    -1
  58. #define TAG_TCFUN  -2
  59. #define TAG_ARGS   -3
  60. #define TAG_ENV    -4
  61.  
  62. #define GC_Node     GCNODE gc1
  63. #define GC_Node2    GCNODE gc1, gc2
  64. #define GC_Node3    GCNODE gc1, gc2, gc3
  65. #define GC_Node4    GCNODE gc1, gc2, gc3, gc4
  66. #define GC_Node5    GCNODE gc1, gc2, gc3, gc4, gc5
  67. #define GC_Node6    GCNODE gc1, gc2, gc3, gc4, gc5, gc6
  68.  
  69. #define Tag_Node    GC_Node3
  70.  
  71. #define Tag_Link(args,fun,env) {\
  72.     gc1.gclen = TAG_ARGS; gc1.gcobj = &args; gc1.next = GC_List;\
  73.     gc2.gclen = Tail_Call ? TAG_TCFUN : TAG_FUN;\
  74.     gc2.gcobj = &fun;  gc2.next = &gc1;\
  75.     gc3.gclen = TAG_ENV;  gc3.gcobj = &env;  gc3.next = &gc2; GC_List = &gc3;\
  76. }
  77.  
  78. #define Tag_Unlink  GC_Unlink
  79.  
  80. #define GC_Link(x) {\
  81.     gc1.gclen = 0; gc1.gcobj = &x; gc1.next = GC_List; GC_List = &gc1;\
  82. }
  83.  
  84. #define GC_Link2(x1,x2) {\
  85.     gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  86.     gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1; GC_List = &gc2;\
  87. }
  88.  
  89. #define GC_Link3(x1,x2,x3) {\
  90.     gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  91.     gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  92.     gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2; GC_List = &gc3;\
  93. }
  94.  
  95. #define GC_Link4(x1,x2,x3,x4) {\
  96.     gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  97.     gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  98.     gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
  99.     gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3; GC_List = &gc4;\
  100. }
  101.  
  102. #define GC_Link5(x1,x2,x3,x4,x5) {\
  103.     gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  104.     gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  105.     gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
  106.     gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3;\
  107.     gc5.gclen = 0; gc5.gcobj = &x5; gc5.next = &gc4; GC_List = &gc5;\
  108. }
  109.  
  110. #define GC_Link6(x1,x2,x3,x4,x5,x6) {\
  111.     gc1.gclen = 0; gc1.gcobj = &x1; gc1.next = GC_List;\
  112.     gc2.gclen = 0; gc2.gcobj = &x2; gc2.next = &gc1;\
  113.     gc3.gclen = 0; gc3.gcobj = &x3; gc3.next = &gc2;\
  114.     gc4.gclen = 0; gc4.gcobj = &x4; gc4.next = &gc3;\
  115.     gc5.gclen = 0; gc5.gcobj = &x5; gc5.next = &gc4;\
  116.     gc6.gclen = 0; gc6.gcobj = &x6; gc6.next = &gc5; GC_List = &gc6;\
  117. }
  118.  
  119. #define GC_Unlink (GC_List = gc1.next)
  120.  
  121. #define Global_GC_Link(x) Func_Global_GC_Link(&x)
  122.  
  123.  
  124. #define Check_Type(x,t) {\
  125.     if (TYPE(x) != t) Wrong_Type (x, t);\
  126. }
  127.  
  128. #define Check_List(x) {\
  129.     if (TYPE(x) != T_Pair && !Nullp (x)) Wrong_Type_Combination (x, "list");\
  130. }
  131.  
  132. #define Check_Number(x) {\
  133.     register t = TYPE(x);\
  134.     if (!Numeric (t)) Wrong_Type_Combination (x, "number");\
  135. }
  136.  
  137. #define Check_Integer(x) {\
  138.     register t = TYPE(x);\
  139.     if (t != T_Fixnum && t != T_Bignum) Wrong_Type (x, T_Fixnum);\
  140. }
  141.  
  142. #define Check_Mutable(x) {\
  143.     if (ISCONST(x))\
  144.     Primitive_Error ("attempt to modify constant");\
  145. }
  146.  
  147. #endif
  148.